package servlet;

import dao.DaoAlbum;
import dao.DaoArtista;
import dao.DaoMusica;
import dao.DaoTagAlbum;
import dao.DaoTagArtista;
import dao.DaoTagMusica;
import entidades.Album;
import entidades.Artista;
import entidades.Musica;
import entidades.TagAlbum;
import entidades.TagArtista;
import entidades.TagMusica;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import util.Global;
import util.Upload;
import util.Util;

@WebServlet(name = "ServletGerenciamentoEdicao", urlPatterns = {"/ServletGerenciamentoEdicao"})
public class ServletGerenciamentoEdicao extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        Upload upload = new Upload(getServletContext().getRealPath(Global.albumData_path));
        List list = upload.processRequest(request);
        Map<String, String> map = upload.getFormValues(list);
        String tipo = map.get("tipoEdicao");
        int id = Integer.parseInt(map.get("id"));
        if (tipo.equals("musica")) {
            String titulo = map.get("titulo");
            String duracao = map.get("duracao");
            String letra = map.get("letra");
            String compositor = map.get("compositor");
            String tags = map.get("tags");
            if (Util.valida(Util.CAMPO_TEXTO, titulo) && Util.valida(Util.CAMPO_TEXTO, letra) && Util.valida(Util.CAMPO_TEXTO, compositor)) {
                if (Util.valida(Util.CAMPO_DOUBLE, duracao)) {
                    Double dur = Double.parseDouble(duracao);
                    Musica m = new DaoMusica().get(id);
                    m.setTitulo(titulo);
                    m.setDuracao(dur);
                    m.setLetra(letra);
                    m.setCompositor(compositor);
                    salvarTagsMusica(tags.split(";"), m);
                    new DaoMusica().update(m);
                    RequestDispatcher rd = request.getRequestDispatcher("gerenciamento.jsp");
                    rd.forward(request, response);
                } else {
                    request.setAttribute("erro", "Campo Duração inválido, favor digitar somente números com casas decimais separadas por '.' ");
                    RequestDispatcher rd = request.getRequestDispatcher("edGerenciamento.jsp");
                    rd.forward(request, response);
                }
            } else {
                request.setAttribute("erro", "Nenhum dos campos pode ser vazio");
                RequestDispatcher rd = request.getRequestDispatcher("edGerenciamento.jsp");
                rd.forward(request, response);
            }
        } else if (tipo.equals("album")) {
            String nome = map.get("nome");
            String tags = map.get("tags");
            String imagem = map.get("imagem");
            if (Util.valida(Util.CAMPO_TEXTO, nome) && Util.valida(Util.CAMPO_TEXTO, tags)) {
                Album a = new DaoAlbum().get(id);
                a.setNome(nome);
                if (imagem != null) {
                    a.setImagem(imagem);
                }
                String[] str = tags.split(";");
                salvarTagsAlbum(str, a);
                //Salva o album no banco de dados
                new DaoAlbum().update(a);

                RequestDispatcher rd = request.getRequestDispatcher("gerenciamento.jsp");
                rd.forward(request, response);
            } else {
                request.setAttribute("erro", "Informações Inválidas");
                RequestDispatcher rd = request.getRequestDispatcher("edGerenciamento.jsp");
                rd.forward(request, response);
            }

        } else if (tipo.equals("artista")) {
            String nome = map.get("nome");
            String historia = map.get("historia");
            String nacionalidade = map.get("nacionalidade");
            String imagem = map.get("imagem");
            String tags = map.get("tags");
            String funcao = map.get("funcao");
            String dtNasc = map.get("dtNasc");
            if (Util.valida(Util.CAMPO_TEXTO, nome) && Util.valida(Util.CAMPO_TEXTO, historia) && Util.valida(Util.CAMPO_TEXTO, nacionalidade)
                    && Util.valida(Util.CAMPO_TEXTO, tags) && Util.valida(Util.CAMPO_TEXTO, funcao) && Util.valida(Util.CAMPO_DATA, dtNasc)) {
                Date nascimento = null;
                try {
                    nascimento = Util.validaData(dtNasc);
                } catch (ParseException ex) {
                    Logger.getLogger(ServletCadArtista.class.getName()).log(Level.SEVERE, null, ex);
                }
                Artista a = new DaoArtista().get(id);
                a.setNome(nome);
                a.setHistoria(historia);
                a.setNacionalidade(nacionalidade);
                a.setFuncao(funcao);
                a.setNascimento(nascimento);
                if (imagem != null) {
                    a.setImagem(imagem);
                }
                String[] str = tags.split(";");
                salvarTagsArtista(str, a);
                new DaoArtista().update(a);

                RequestDispatcher rd = request.getRequestDispatcher("gerenciamento.jsp");
                rd.forward(request, response);
            } else {
                request.setAttribute("erro", "Nenhum dos campos pode ser vazio");
                RequestDispatcher rd = request.getRequestDispatcher("edGerenciamento.jsp");
                rd.forward(request, response);
            }
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    private void salvarTagsMusica(String[] str, Musica m) {
        m.setTags(new ArrayList<TagMusica>());
        //Verificar se a tagMusica existe, e existir adicionar a musica a ela, se não criar a tag
        for (String name : str) {
            String tagName = name.trim();
            if (!tagName.isEmpty()) {
                if (!m.getTags().contains(new TagMusica(tagName))) {
                    List<TagMusica> l = new DaoTagMusica().buscaTagNome(tagName);
                    if (l.isEmpty()) {
                        //Cria tag e adiciona a música a ela
                        TagMusica tag = new TagMusica(tagName);
                        tag.addMusica(m);
                        m.addTagMusica(tag);
                        //new DaoTagMusica().insert(tag);
                    } else {
                        //Adiciona a música a tag
                        TagMusica tag = l.get(l.indexOf(new TagMusica(tagName)));
                        tag.addMusica(m);
                        m.addTagMusica(tag);
                        //new DaoTagMusica().update(tag);
                    }
                }
            }
        }
    }

    private void salvarTagsAlbum(String[] str, Album a) {
        a.setTags(new ArrayList<TagAlbum>());
        //Verificar se a tagMusica existe, e existir adicionar a musica a ela, se não criar a tag
        for (String name : str) {
            String tagName = name.trim();
            if (!tagName.isEmpty()) {
                if (!a.getTags().contains(new TagAlbum(tagName))) {
                    List<TagAlbum> l = new DaoTagAlbum().buscaTagNome(tagName);
                    if (l.isEmpty()) {
                        //Cria tag e adiciona a música a ela
                        TagAlbum tag = new TagAlbum(tagName);
                        tag.addAlbum(a);
                        a.addTagAlbum(tag);
                    } else {
                        //Adiciona a música a tag
                        TagAlbum tag = l.get(l.indexOf(new TagAlbum(tagName)));
                        tag.addAlbum(a);
                        a.addTagAlbum(tag);
                    }
                }
            }
        }
    }

    private void salvarTagsArtista(String[] str, Artista a) {
        a.setTags(new ArrayList<TagArtista>());
        //Verificar se a tagMusica existe, e existir adicionar a musica a ela, se não criar a tag
        for (String name : str) {
            String tagName = name.trim();
            if (!tagName.isEmpty()) {
                if (!a.getTags().contains(new TagArtista(tagName))) {
                    List<TagArtista> l = new DaoTagArtista().buscaTagNome(tagName);
                    if (l.isEmpty()) {
                        //Cria tag e adiciona a música a ela
                        TagArtista tag = new TagArtista(tagName);
                        tag.addArtista(a);
                        a.addTag(tag);
                    } else {
                        //Adiciona a música a tag
                        TagArtista tag = l.get(l.indexOf(new TagArtista(tagName)));
                        tag.addArtista(a);
                        a.addTag(tag);
                    }
                }
            }
        }
    }
}
